# Python 趣味编程：第 2 章
#    例題 2.3 球和墙壁的建模
#  (1) 动画
# --------------------------
# 程序名: 02-ball-3.py

from tkinter import *
from dataclasses import dataclass
import time

DURATION= 0.001    # sleep 时间 = 绘制的间隔
X = 0              # 球的 X 初始值
Y = 100            # 球的 Y 初始值
D = 10             # 球的直径

@dataclass
class Ball:
    id: int
    x: int
    y: int
    d: int
    c: str

# 直径 d 若省略则为 3，颜色 c 若省略则为 "black"
def make_ball(x, y, d=3, c="black"):
    id = canvas.create_rectangle(x, y, x + d, y + d,
                                 fill=c, outline=c)
    return Ball(id, x, y, d, c)

# 一个重画球的函数，封装了 coords
def redraw_ball(ball):
    d = ball.d
    canvas.coords(ball.id, ball.x, ball.y,
                  ball.x + d, ball.y + d)

tk = Tk()
canvas = Canvas(tk, width=800, height=600, bd=0)
canvas.pack()
tk.update()

ball = make_ball(X, Y, D, "darkblue") # 生成实际的球

for p in range(0, 600, 2):   # 改变中间变量 p
    ball.x = p               # 在球的 x 坐标中代入 p
    redraw_ball(ball)        # 调用封装的函数，移动
    tk.update()              # 将绘图反映到画面上
    time.sleep(DURATION)
